package org.uam.common;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
 * 
 * <一句话功能简述>
 * <功能详细描述>
 * 
 * @author  Leo
 * @version  [版本号, 2012-11-3]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 * @param <T> 类型
 */
public class EntityDaoImpl<T> extends IbatisGenericDao implements IEntityDao<T>
{

    /**
     * DAO所管理的Entity类型.
     */
    protected Class<T> entityClass;

    protected String primaryKeyName;

    /**
     * 在构造函数中将泛型T.class赋给entityClass
     */
    public EntityDaoImpl()
    {
        entityClass = GenericUtils.getSuperClassGenricType(getClass());
    }

    /**
     * 取得entityClass.
     * 
     * @return
     */
    protected Class<T> getEntityClass()
    {
        return entityClass;
    }

    /**
     * 通过对象删除一条记录
     * 
     * @return
     */
    public int delete(T o)
    {
        return super.remove(o);
    }

    /**
     * 通过id批量删除对应记录
     * 
     * @param ids
     *            id数组
     */
    public void deleteBatch(String... ids)
    {
        super.removeByIds(getEntityClass(), ids);

    }

    /**
     * 通过被序列化的id（主键），删除id对应记录
     * 
     * @param id
     *            主键id
     */
    public void deleteByPrimarykey(Serializable id)
    {
        super.removeById(getEntityClass(), id);

    }

    /**
     * 获取所有行数
     * 
     * @return
     */
    public int getEntityTotalCount()
    {
        return super.getCount(getEntityClass());
    }

    /**
     * 通过条件查询满足条件的行数
     * 
     * @param parameters
     * @return
     */
    public int getEntityTotalCount(Object parameters)
    {
        return super.getCount(getEntityClass(), parameters);
    }

    /**
     * 通过自定义条件查询满足条件的行数
     * 
     * @param statementId
     *            自定义SQL
     * @param parameters
     *            查询条件
     * @return
     */
    public int getEntityTotalCount(String statementId, Object parameters)
    {
        return super.getCount(getEntityClass(), statementId, parameters);
    }

    /**
     * 获得所有列表信息
     * 
     * @return
     */
    public List<T> findAll()
    {
        return super.getAll(getEntityClass());
    }

    /**
     *通过主键获得所有列表信息
     * 
     * @param id
     * @return
     */
    public T findByPrimarykey(Serializable id)
    {
        return super.get(getEntityClass(), id);
    }

    /**
     *通过自定义sql语句查询列表信息
     * 
     * @param statementId
     * @param parameters
     * @return
     */
    public List<T> findListByCustom(String statementId, Object parameters)
    {
        return super.getListByCustom(getEntityClass(), statementId, parameters);
    }

    /**
     * 自动补齐
     * 
     * @param statementId
     * @param parameters
     * @return
     */
    public List<String> findListByAuto(String statementId, Object parameters)
    {
        return super.getListByCustom(getEntityClass(), statementId, parameters);
    }

    /**
     *通过特定的查询条件查询列表信息
     * 
     * @param map
     * @return
     */
    public List<T> findListByMap(Object parameters)
    {
        return super.getListByMap(getEntityClass(), parameters);
    }

    /**
     * 通过存储过程获取列表信息
     * 
     * @param map
     *            存储过程入参和出参
     * @return 列表
     */
    public List<T> findListByProcMap(Map map)
    {
        return super.getListByProcMap(getEntityClass(), map);
    }

    /**
     *通过自定义sql和特定的查询条件语句查询对象
     * 
     * @param statementId
     * @param parameters
     * @return
     */
    public T findObjectByCustom(String statementId, Object parameters)
    {
        return super.getObjectByCustom(getEntityClass(), statementId,
                parameters);
    }

    /**
     * 新增
     * 
     * @param o
     * @return
     */
    public void insert(T o)
    {
        super.create(o);
    }

    /**
     * 修改
     * 
     * @param o
     * @return
     */
    public int update(T o)
    {
        return super.modify(o);
    }

    /**
     * 根据特定的sql语句修改
     * 
     * @param o
     * @return
     */
    public void updateCustom(String statementId, Object parameters)
    {
        super.modifyCustom(getEntityClass(), statementId, parameters);
    }

    public String getPrimaryKeyName()
    {
        return primaryKeyName;
    }

    public void setPrimaryKeyName(String primaryKeyName)
    {
        this.primaryKeyName = primaryKeyName;
    }

}
